﻿using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using Microsoft.Win32;

namespace Xioa_UI.DataOrigin;

public class ControlAttachProperty
{
    /************************************ Attach Property **************************************/

    #region FocusBackground 获得焦点背景色，

    public static readonly DependencyProperty FocusBackgroundProperty = DependencyProperty.RegisterAttached(
        "FocusBackground", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetFocusBackground(DependencyObject element, Brush value)
    {
        element.SetValue(FocusBackgroundProperty, value);
    }

    public static Brush GetFocusBackground(DependencyObject element)
    {
        return (Brush)element.GetValue(FocusBackgroundProperty);
    }

    #endregion

    #region FocusForeground 获得焦点前景色，

    public static readonly DependencyProperty FocusForegroundProperty = DependencyProperty.RegisterAttached(
        "FocusForeground", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetFocusForeground(DependencyObject element, Brush value)
    {
        element.SetValue(FocusForegroundProperty, value);
    }

    public static Brush GetFocusForeground(DependencyObject element)
    {
        return (Brush)element.GetValue(FocusForegroundProperty);
    }

    #endregion

    #region PressedBackground 按下背景色，

    public static readonly DependencyProperty PressedBackgroundProperty = DependencyProperty.RegisterAttached(
        "PressedBackground", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetPressedBackground(DependencyObject element, Brush value)
    {
        element.SetValue(PressedBackgroundProperty, value);
    }

    public static Brush GetPressedBackground(DependencyObject element)
    {
        return (Brush)element.GetValue(PressedBackgroundProperty);
    }

    #endregion

    #region PressedForeground 按下前景色，

    public static readonly DependencyProperty PressedForegroundProperty = DependencyProperty.RegisterAttached(
        "PressedForeground", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetPressedForeground(DependencyObject element, Brush value)
    {
        element.SetValue(PressedForegroundProperty, value);
    }

    public static Brush GetPressedForeground(DependencyObject element)
    {
        return (Brush)element.GetValue(PressedForegroundProperty);
    }

    #endregion

    #region MouseOverBackgroundProperty 鼠标悬浮背景色

    public static readonly DependencyProperty MouseOverBackgroundProperty = DependencyProperty.RegisterAttached(
        "MouseOverBackground", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetMouseOverBackground(DependencyObject element, Brush value)
    {
        element.SetValue(MouseOverBackgroundProperty, value);
    }

    public static Brush MouseOverBackground(DependencyObject element)
    {
        return (Brush)element.GetValue(FocusBackgroundProperty);
    }

    #endregion

    #region MouseOverForegroundProperty 鼠标悬浮前景色

    public static readonly DependencyProperty MouseOverForegroundProperty = DependencyProperty.RegisterAttached(
        "MouseOverForeground", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetMouseOverForeground(DependencyObject element, Brush value)
    {
        element.SetValue(MouseOverForegroundProperty, value);
    }

    public static Brush MouseOverForeground(DependencyObject element)
    {
        return (Brush)element.GetValue(FocusForegroundProperty);
    }

    #endregion

    #region FocusBorderBrush 焦点边框色，输入控件

    public static readonly DependencyProperty FocusBorderBrushProperty = DependencyProperty.RegisterAttached(
        "FocusBorderBrush", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetFocusBorderBrush(DependencyObject element, Brush value)
    {
        element.SetValue(FocusBorderBrushProperty, value);
    }

    public static Brush GetFocusBorderBrush(DependencyObject element)
    {
        return (Brush)element.GetValue(FocusBorderBrushProperty);
    }

    #endregion

    #region MouseOverBorderBrush 鼠标进入边框色，输入控件

    public static readonly DependencyProperty MouseOverBorderBrushProperty =
        DependencyProperty.RegisterAttached("MouseOverBorderBrush", typeof(Brush), typeof(ControlAttachProperty),
            new FrameworkPropertyMetadata(Brushes.Transparent,
                FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.Inherits));

    /// <summary>
    /// Sets the brush used to draw the mouse over brush.
    /// </summary>
    public static void SetMouseOverBorderBrush(DependencyObject obj, Brush value)
    {
        obj.SetValue(MouseOverBorderBrushProperty, value);
    }

    /// <summary>
    /// Gets the brush used to draw the mouse over brush.
    /// </summary>
    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.TextBox))]
    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.CheckBox))]
    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.RadioButton))]
    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.DatePicker))]
    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.ComboBox))]
    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.RichTextBox))]
    public static Brush GetMouseOverBorderBrush(DependencyObject obj)
    {
        return (Brush)obj.GetValue(MouseOverBorderBrushProperty);
    }

    #endregion

    #region AttachContentProperty 附加组件模板

    /// <summary>
    /// 附加组件模板
    /// </summary>
    public static readonly DependencyProperty AttachContentProperty = DependencyProperty.RegisterAttached(
        "AttachContent", typeof(ControlTemplate), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static ControlTemplate GetAttachContent(DependencyObject d)
    {
        return (ControlTemplate)d.GetValue(AttachContentProperty);
    }

    public static void SetAttachContent(DependencyObject obj, ControlTemplate value)
    {
        obj.SetValue(AttachContentProperty, value);
    }

    #endregion

    #region WatermarkProperty 水印

    /// <summary>
    /// 水印
    /// </summary>
    public static readonly DependencyProperty WatermarkProperty = DependencyProperty.RegisterAttached(
        "Watermark", typeof(string), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(""));

    public static string GetWatermark(DependencyObject d)
    {
        return (string)d.GetValue(WatermarkProperty);
    }

    public static void SetWatermark(DependencyObject obj, string value)
    {
        obj.SetValue(WatermarkProperty, value);
    }

    #endregion

    #region FIconProperty 字体图标

    /// <summary>
    /// 字体图标
    /// </summary>
    public static readonly DependencyProperty FIconProperty = DependencyProperty.RegisterAttached(
        "FIcon", typeof(string), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(""));

    public static string GetFIcon(DependencyObject d)
    {
        return (string)d.GetValue(FIconProperty);
    }

    public static void SetFIcon(DependencyObject obj, string value)
    {
        obj.SetValue(FIconProperty, value);
    }

    #endregion

    #region FIconSizeProperty 字体图标大小

    /// <summary>
    /// 字体图标
    /// </summary>
    public static readonly DependencyProperty FIconSizeProperty = DependencyProperty.RegisterAttached(
        "FIconSize", typeof(double), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(12D));

    public static double GetFIconSize(DependencyObject d)
    {
        return (double)d.GetValue(FIconSizeProperty);
    }

    public static void SetFIconSize(DependencyObject obj, double value)
    {
        obj.SetValue(FIconSizeProperty, value);
    }

    #endregion

    #region FIconMarginProperty 字体图标边距

    /// <summary>
    /// 字体图标
    /// </summary>
    public static readonly DependencyProperty FIconMarginProperty = DependencyProperty.RegisterAttached(
        "FIconMargin", typeof(Thickness), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static Thickness GetFIconMargin(DependencyObject d)
    {
        return (Thickness)d.GetValue(FIconMarginProperty);
    }

    public static void SetFIconMargin(DependencyObject obj, Thickness value)
    {
        obj.SetValue(FIconMarginProperty, value);
    }

    #endregion

    #region AllowsAnimationProperty 启用旋转动画

    /// <summary>
    /// 启用旋转动画
    /// </summary>
    public static readonly DependencyProperty AllowsAnimationProperty = DependencyProperty.RegisterAttached(
        "AllowsAnimation"
        , typeof(bool), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(false, AllowsAnimationChanged));

    public static bool GetAllowsAnimation(DependencyObject d)
    {
        return (bool)d.GetValue(AllowsAnimationProperty);
    }

    public static void SetAllowsAnimation(DependencyObject obj, bool value)
    {
        obj.SetValue(AllowsAnimationProperty, value);
    }

    /// <summary>
    /// 旋转动画刻度
    /// </summary>
    private static DoubleAnimation RotateAnimation =
        new DoubleAnimation(0, new Duration(TimeSpan.FromMilliseconds(200)));

    /// <summary>
    /// 绑定动画事件
    /// </summary>
    private static void AllowsAnimationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var uc = d as FrameworkElement;
        if (uc == null) return;
        if (uc.RenderTransformOrigin == new Point(0, 0))
        {
            uc.RenderTransformOrigin = new Point(0.5, 0.5);
            RotateTransform trans = new RotateTransform(0);
            uc.RenderTransform = trans;
        }

        var value = (bool)e.NewValue;
        if (value)
        {
            RotateAnimation.To = 180;
            uc.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, RotateAnimation);
        }
        else
        {
            RotateAnimation.To = 0;
            uc.RenderTransform.BeginAnimation(RotateTransform.AngleProperty, RotateAnimation);
        }
    }

    #endregion

    #region CornerRadiusProperty Border圆角

    /// <summary>
    /// Border圆角
    /// </summary>
    public static readonly DependencyProperty CornerRadiusProperty = DependencyProperty.RegisterAttached(
        "CornerRadius", typeof(CornerRadius), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static CornerRadius GetCornerRadius(DependencyObject d)
    {
        return (CornerRadius)d.GetValue(CornerRadiusProperty);
    }

    public static void SetCornerRadius(DependencyObject obj, CornerRadius value)
    {
        obj.SetValue(CornerRadiusProperty, value);
    }

    #endregion

    #region LabelProperty TextBox的头部Label

    /// <summary>
    /// TextBox的头部Label
    /// </summary>
    public static readonly DependencyProperty LabelProperty = DependencyProperty.RegisterAttached(
        "Label", typeof(string), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.TextBox))]
    public static string GetLabel(DependencyObject d)
    {
        return (string)d.GetValue(LabelProperty);
    }

    public static void SetLabel(DependencyObject obj, string value)
    {
        obj.SetValue(LabelProperty, value);
    }

    #endregion

    #region LabelTemplateProperty TextBox的头部Label模板

    /// <summary>
    /// TextBox的头部Label模板
    /// </summary>
    public static readonly DependencyProperty LabelTemplateProperty = DependencyProperty.RegisterAttached(
        "LabelTemplate", typeof(ControlTemplate), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    [AttachedPropertyBrowsableForType(typeof(System.Windows.Controls.TextBox))]
    public static ControlTemplate GetLabelTemplate(DependencyObject d)
    {
        return (ControlTemplate)d.GetValue(LabelTemplateProperty);
    }

    public static void SetLabelTemplate(DependencyObject obj, ControlTemplate value)
    {
        obj.SetValue(LabelTemplateProperty, value);
    }

    #endregion

    #region PopupBackground 获得焦点背景色，

    public static readonly DependencyProperty PopupBackgroundProperty = DependencyProperty.RegisterAttached(
        "PopupBackground", typeof(Brush), typeof(ControlAttachProperty), new FrameworkPropertyMetadata(null));

    public static void SetPopupBackground(DependencyObject element, Brush value)
    {
        element.SetValue(PopupBackgroundProperty, value);
    }

    public static Brush GetPopupBackground(DependencyObject element)
    {
        return (Brush)element.GetValue(PopupBackgroundProperty);
    }

    #endregion


    /************************************ RoutedUICommand **************************************/

    #region ClearTextCommand 清除输入框Text事件命令

    /// <summary>
    /// 清除输入框Text事件命令，需要使用IsClearTextButtonBehaviorEnabledChanged绑定命令
    /// </summary>
    public static RoutedUICommand ClearTextCommand { get; private set; }

    /// <summary>
    /// ClearTextCommand绑定事件
    /// </summary>
    private static readonly CommandBinding ClearTextCommandBinding;

    #endregion

    #region OpenFileCommand 选择文件命令

    /// <summary>
    /// 选择文件命令，需要使用IsClearTextButtonBehaviorEnabledChanged绑定命令
    /// </summary>
    public static RoutedUICommand OpenFileCommand { get; private set; }

    /// <summary>
    /// OpenFileCommand绑定事件
    /// </summary>
    private static readonly CommandBinding OpenFileCommandBinding;

    /// <summary>
    /// 执行OpenFileCommand
    /// </summary>
    private static void OpenFileButtonClick(object sender, ExecutedRoutedEventArgs e)
    {
        var tbox = e.Parameter as FrameworkElement;
        var txt = tbox as System.Windows.Controls.TextBox;
        string filter = txt.Tag == null ? "所有文件(*.*)|*.*" : txt.Tag.ToString();
        if (filter.Contains(".bin"))
        {
            filter += "|所有文件(*.*)|*.*";
        }

        if (txt == null) return;
        OpenFileDialog fd = new OpenFileDialog();
        fd.Title = "请选择文件";
        //“图像文件(*.bmp, *.jpg)|*.bmp;*.jpg|所有文件(*.*)|*.*”
        fd.Filter = filter;
        fd.FileName = txt.Text.Trim();
        if (fd.ShowDialog() == true)
        {
            txt.Text = fd.FileName;
        }

        tbox.Focus();
    }

    #endregion


    /// <summary>
    /// 静态构造函数
    /// </summary>
    static ControlAttachProperty()
    {
        //ClearTextCommand
        ClearTextCommand = new RoutedUICommand();
        ClearTextCommandBinding = new CommandBinding(ClearTextCommand);

        //OpenFileCommand
        OpenFileCommand = new RoutedUICommand();
        OpenFileCommandBinding = new CommandBinding(OpenFileCommand);
        OpenFileCommandBinding.Executed += OpenFileButtonClick;
    }
}